{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "fer2013.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "machine_shape": "hm",
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Environment (conda_tensorflow_p36)",
      "language": "python",
      "name": "conda_tensorflow_p36"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.5"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/amilkh/cs230-fer/blob/transfer-learning/Final-ResNet50-ClassWeight.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "gwdg7Sv3XBaP",
        "outputId": "9f1936ff-14c4-432a-8367-5a805680dfc7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 577
        }
      },
      "source": [
        "%tensorflow_version 1.x\n",
        "!pip install keras-vggface\n",
        "!pip install scikit-image\n",
        "!pip install pydot"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting keras-vggface\n",
            "  Downloading https://files.pythonhosted.org/packages/2f/7d/5f0319ebdc09ac1a2272364fa9583f5067b6f8aff93fbbf8835d81cbaad7/keras_vggface-0.6-py3-none-any.whl\n",
            "Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.18.1)\n",
            "Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.4.1)\n",
            "Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (7.0.0)\n",
            "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (3.13)\n",
            "Requirement already satisfied: keras in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (2.2.5)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (2.8.0)\n",
            "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.12.0)\n",
            "Requirement already satisfied: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vggface) (1.1.0)\n",
            "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vggface) (1.0.8)\n",
            "Installing collected packages: keras-vggface\n",
            "Successfully installed keras-vggface-0.6\n",
            "Requirement already satisfied: scikit-image in /usr/local/lib/python3.6/dist-packages (0.16.2)\n",
            "Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (1.1.1)\n",
            "Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (3.2.0)\n",
            "Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (2.4.1)\n",
            "Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (2.4)\n",
            "Requirement already satisfied: pillow>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (7.0.0)\n",
            "Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (1.4.1)\n",
            "Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/dist-packages (from PyWavelets>=0.4.0->scikit-image) (1.18.1)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.1.0)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (2.4.6)\n",
            "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (2.8.1)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (0.10.0)\n",
            "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=2.0->scikit-image) (4.4.2)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib!=3.0.0,>=2.0.0->scikit-image) (45.2.0)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.12.0)\n",
            "Requirement already satisfied: pydot in /usr/local/lib/python3.6/dist-packages (1.3.0)\n",
            "Requirement already satisfied: pyparsing>=2.1.4 in /usr/local/lib/python3.6/dist-packages (from pydot) (2.4.6)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "2nz38mJZXN_P",
        "outputId": "b01e85af-835b-443c-b816-bd927cbd6b0c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "\n",
        "import tensorflow as tf\n",
        "from tensorflow.keras.layers import *\n",
        "from tensorflow.python.lib.io import file_io\n",
        "\n",
        "%matplotlib inline\n",
        "\n",
        "import keras\n",
        "from keras import backend as K\n",
        "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
        "from keras.models import load_model\n",
        "from keras.preprocessing.image import ImageDataGenerator\n",
        "from keras_vggface.vggface import VGGFace\n",
        "from keras.utils import plot_model\n",
        "from sklearn.metrics import *\n",
        "from keras.engine import Model\n",
        "from keras.layers import Input, Flatten, Dense, Activation, Conv2D, MaxPool2D, BatchNormalization, Dropout, MaxPooling2D\n",
        "import skimage\n",
        "from skimage.transform import rescale, resize\n",
        "\n",
        "import pydot"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Using TensorFlow backend.\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1fZczU8lGkX-",
        "colab_type": "code",
        "outputId": "f94e48b4-da9b-496a-99fd-63824441666b",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 127
        }
      },
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
            "\n",
            "Enter your authorization code:\n",
            "··········\n",
            "Mounted at /content/drive\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "nUcd6yIGduUW",
        "outputId": "5f033a78-1742-43fb-8ee4-fe02be46fc95",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 53
        }
      },
      "source": [
        "print(tf.__version__)\n",
        "print(keras.__version__)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "1.15.0\n",
            "2.2.5\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v60q28mDHnN9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "EPOCHS = 50\n",
        "BS = 128\n",
        "DROPOUT_RATE = 0.5\n",
        "FROZEN_LAYER_NUM = 170\n",
        "\n",
        "ADAM_LEARNING_RATE = 0.001\n",
        "SGD_LEARNING_RATE = 0.01\n",
        "SGD_DECAY = 0.0001\n",
        "\n",
        "Resize_pixelsize = 197"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "itKZtFV0F7b1",
        "colab_type": "code",
        "outputId": "adc17a95-2f3e-4b71-a336-abb760b59f94",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 667
        }
      },
      "source": [
        "vgg_notop = VGGFace(model='resnet50', include_top=False, input_shape=(Resize_pixelsize, Resize_pixelsize, 3), pooling='avg')\n",
        "last_layer = vgg_notop.get_layer('avg_pool').output\n",
        "x = Flatten(name='flatten')(last_layer)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "x = Dense(4096, activation='relu', name='fc6')(x)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "x = Dense(1024, activation='relu', name='fc7')(x)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "# l=0\n",
        "# for layer in vgg_notop.layers:\n",
        "#     print(layer,\"[\"+str(l)+\"]\")\n",
        "#     l=l+1\n",
        "    \n",
        "batch_norm_indices = [2, 6, 9, 13, 14, 18, 21, 24, 28, 31, 34, 38, 41, 45, 46, 53, 56, 60, 63, 66, 70, 73, 76, 80, 83, 87, 88, 92, 95, 98, 102, 105, 108, 112, 115, 118, 122, 125, 128, 132, 135, 138, 142, 145, 149, 150, 154, 157, 160, 164, 167, 170]\n",
        "for i in range(FROZEN_LAYER_NUM):\n",
        "    if i not in batch_norm_indices:\n",
        "        vgg_notop.layers[i].trainable = False\n",
        "# print('vgg layer 2 is trainable: ' + str(vgg_notop.layers[2].trainable))\n",
        "# print('vgg layer 3 is trainable: ' + str(vgg_notop.layers[3].trainable))\n",
        "\n",
        "out = Dense(7, activation='softmax', name='classifier')(x)\n",
        "\n",
        "model = Model(vgg_notop.input, out)\n",
        "\n",
        "\n",
        "optim = keras.optimizers.Adam(lr=ADAM_LEARNING_RATE, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)\n",
        "#optim = keras.optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)\n",
        "sgd = keras.optimizers.SGD(lr=SGD_LEARNING_RATE, momentum=0.9, decay=SGD_DECAY, nesterov=True)\n",
        "rlrop = keras.callbacks.ReduceLROnPlateau(monitor='val_acc',mode='max',factor=0.5, patience=10, min_lr=0.00001, verbose=1)\n",
        "\n",
        "model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "# plot_model(model, to_file='model2.png', show_shapes=True)"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:203: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:2041: The name tf.nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:148: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4267: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4271: The name tf.nn.avg_pool is deprecated. Please use tf.nn.avg_pool2d instead.\n",
            "\n",
            "Downloading data from https://github.com/rcmalli/keras-vggface/releases/download/v2.0/rcmalli_vggface_tf_notop_resnet50.h5\n",
            "94699520/94694792 [==============================] - 1s 0us/step\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3576: The name tf.log is deprecated. Please use tf.math.log instead.\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v0mXUNZB-yI5",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "! rm -rf train; mkdir train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/emotion.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/facesdb.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/train.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/googlesearch.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/googleset.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/jaffe.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/umea.zip' -d train"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TUuN9SLX_Qvl",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "! rm -rf dev; mkdir dev\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/test-public.zip' -d dev\n",
        "! rm -rf test; mkdir test\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/test-private.zip' -d test"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "560jefnZ_Cyq",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
        "\n",
        "def get_datagen(dataset, aug=False):\n",
        "    if aug:\n",
        "        datagen = ImageDataGenerator(\n",
        "                            rescale=1./255,\n",
        "                            featurewise_center=False,\n",
        "                            featurewise_std_normalization=False,\n",
        "                            rotation_range=10,\n",
        "                            width_shift_range=0.1,\n",
        "                            height_shift_range=0.1,\n",
        "                            zoom_range=0.1,\n",
        "                            horizontal_flip=True)\n",
        "    else:\n",
        "        datagen = ImageDataGenerator(rescale=1./255)\n",
        "\n",
        "    return datagen.flow_from_directory(\n",
        "            dataset,\n",
        "            target_size=(197, 197),\n",
        "            color_mode='rgb',\n",
        "            shuffle = True,\n",
        "            class_mode='categorical',\n",
        "            batch_size=BS)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4aQAGQP5_Gpl",
        "colab_type": "code",
        "outputId": "8d623eb1-0494-4015-8648-94ba3e6d0546",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 127
        }
      },
      "source": [
        "train_generator  = get_datagen('/content/train', True)\n",
        "dev_generator    = get_datagen('/content/dev')\n",
        "test_generator  = get_datagen('/content/test')\n"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/utils.py:173: UserWarning: Using \".tiff\" files with multiple bands will cause distortion. Please verify your output.\n",
            "  warnings.warn('Using \".tiff\" files with multiple bands '\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Found 30452 images belonging to 7 classes.\n",
            "Found 3589 images belonging to 7 classes.\n",
            "Found 3589 images belonging to 7 classes.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "GyHmZ5GRBdRl",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.utils import class_weight\n",
        "file_stream = file_io.FileIO('/content/drive/My Drive/cs230 project/collab/fer2013/dev.csv', mode='r')\n",
        "data = pd.read_csv(file_stream)\n",
        "data[' pixels'] = data[' pixels'].apply(lambda x: [int(pixel) for pixel in x.split()])\n",
        "X, Y = data[' pixels'].tolist(), data['emotion'].values\n",
        "class_weights = class_weight.compute_class_weight('balanced',\n",
        "                                                    np.unique(Y),\n",
        "                                                    Y)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "pLISdlaStbUn",
        "outputId": "5d0ba7d9-de13-41c8-ac76-841892d3ddec",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "history = model.fit_generator(\n",
        "    generator = train_generator,\n",
        "    validation_data=dev_generator, \n",
        "    steps_per_epoch=28709// BS,\n",
        "    validation_steps=3509 // BS,\n",
        "    shuffle=True,\n",
        "    epochs=100,\n",
        "    callbacks=[rlrop],\n",
        "    use_multiprocessing=True,\n",
        "    class_weight=class_weights\n",
        ") "
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From /tensorflow-1.15.0/python3.6/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.\n",
            "\n",
            "Epoch 1/100\n",
            "224/224 [==============================] - 289s 1s/step - loss: 1.9871 - acc: 0.3442 - val_loss: 1.3152 - val_acc: 0.5000\n",
            "Epoch 2/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 1.3912 - acc: 0.4737 - val_loss: 1.1570 - val_acc: 0.5734\n",
            "Epoch 3/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 1.2821 - acc: 0.5175 - val_loss: 1.1171 - val_acc: 0.5929\n",
            "Epoch 4/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 1.2177 - acc: 0.5430 - val_loss: 1.0938 - val_acc: 0.5875\n",
            "Epoch 5/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 1.1654 - acc: 0.5644 - val_loss: 1.0511 - val_acc: 0.6157\n",
            "Epoch 6/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 1.1429 - acc: 0.5725 - val_loss: 1.0393 - val_acc: 0.6109\n",
            "Epoch 7/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 1.1071 - acc: 0.5876 - val_loss: 0.9923 - val_acc: 0.6436\n",
            "Epoch 8/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 1.0827 - acc: 0.5932 - val_loss: 1.0189 - val_acc: 0.6133\n",
            "Epoch 9/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 1.0675 - acc: 0.6012 - val_loss: 1.0019 - val_acc: 0.6307\n",
            "Epoch 10/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 1.0491 - acc: 0.6073 - val_loss: 0.9926 - val_acc: 0.6280\n",
            "Epoch 11/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 1.0260 - acc: 0.6191 - val_loss: 0.9909 - val_acc: 0.6415\n",
            "Epoch 12/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 1.0007 - acc: 0.6255 - val_loss: 0.9617 - val_acc: 0.6454\n",
            "Epoch 13/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 1.0014 - acc: 0.6217 - val_loss: 0.9729 - val_acc: 0.6430\n",
            "Epoch 14/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.9813 - acc: 0.6301 - val_loss: 0.9580 - val_acc: 0.6565\n",
            "Epoch 15/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.9704 - acc: 0.6370 - val_loss: 0.9397 - val_acc: 0.6568\n",
            "Epoch 16/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.9533 - acc: 0.6405 - val_loss: 0.9551 - val_acc: 0.6529\n",
            "Epoch 17/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.9444 - acc: 0.6457 - val_loss: 0.9366 - val_acc: 0.6649\n",
            "Epoch 18/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.9392 - acc: 0.6470 - val_loss: 0.9596 - val_acc: 0.6613\n",
            "Epoch 19/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.9202 - acc: 0.6538 - val_loss: 0.9261 - val_acc: 0.6718\n",
            "Epoch 20/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.9140 - acc: 0.6563 - val_loss: 0.9377 - val_acc: 0.6739\n",
            "Epoch 21/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.9005 - acc: 0.6605 - val_loss: 0.9302 - val_acc: 0.6724\n",
            "Epoch 22/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.8908 - acc: 0.6669 - val_loss: 0.9090 - val_acc: 0.6817\n",
            "Epoch 23/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.8845 - acc: 0.6653 - val_loss: 0.9169 - val_acc: 0.6862\n",
            "Epoch 24/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8817 - acc: 0.6684 - val_loss: 0.9086 - val_acc: 0.6751\n",
            "Epoch 25/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.8605 - acc: 0.6774 - val_loss: 0.9265 - val_acc: 0.6676\n",
            "Epoch 26/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.8529 - acc: 0.6745 - val_loss: 0.8938 - val_acc: 0.6793\n",
            "Epoch 27/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8593 - acc: 0.6747 - val_loss: 0.9198 - val_acc: 0.6844\n",
            "Epoch 28/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8387 - acc: 0.6862 - val_loss: 0.8847 - val_acc: 0.6832\n",
            "Epoch 29/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.8432 - acc: 0.6801 - val_loss: 0.8986 - val_acc: 0.6838\n",
            "Epoch 30/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8255 - acc: 0.6892 - val_loss: 0.8989 - val_acc: 0.6887\n",
            "Epoch 31/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8197 - acc: 0.6911 - val_loss: 0.8900 - val_acc: 0.6889\n",
            "Epoch 32/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8105 - acc: 0.6934 - val_loss: 0.8953 - val_acc: 0.6847\n",
            "Epoch 33/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.8032 - acc: 0.6941 - val_loss: 0.8849 - val_acc: 0.6910\n",
            "Epoch 34/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.7928 - acc: 0.6987 - val_loss: 0.8827 - val_acc: 0.6928\n",
            "Epoch 35/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.7902 - acc: 0.7005 - val_loss: 0.8751 - val_acc: 0.6946\n",
            "Epoch 36/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.7901 - acc: 0.7018 - val_loss: 0.8858 - val_acc: 0.6880\n",
            "Epoch 37/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.7774 - acc: 0.7038 - val_loss: 0.8921 - val_acc: 0.6808\n",
            "Epoch 38/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.7641 - acc: 0.7132 - val_loss: 0.8814 - val_acc: 0.6826\n",
            "Epoch 39/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.7625 - acc: 0.7115 - val_loss: 0.8738 - val_acc: 0.6916\n",
            "Epoch 40/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.7493 - acc: 0.7169 - val_loss: 0.8792 - val_acc: 0.6907\n",
            "Epoch 41/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.7542 - acc: 0.7146 - val_loss: 0.8715 - val_acc: 0.6895\n",
            "Epoch 42/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.7382 - acc: 0.7205 - val_loss: 0.8793 - val_acc: 0.6895\n",
            "Epoch 43/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.7424 - acc: 0.7191 - val_loss: 0.8676 - val_acc: 0.7036\n",
            "Epoch 44/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.7319 - acc: 0.7229 - val_loss: 0.8709 - val_acc: 0.6942\n",
            "Epoch 45/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.7245 - acc: 0.7262 - val_loss: 0.8689 - val_acc: 0.6943\n",
            "Epoch 46/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.7240 - acc: 0.7252 - val_loss: 0.8644 - val_acc: 0.7000\n",
            "Epoch 47/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.7104 - acc: 0.7337 - val_loss: 0.8557 - val_acc: 0.6976\n",
            "Epoch 48/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.7067 - acc: 0.7322 - val_loss: 0.8853 - val_acc: 0.6976\n",
            "Epoch 49/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.6943 - acc: 0.7370 - val_loss: 0.8441 - val_acc: 0.7063\n",
            "Epoch 50/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.6936 - acc: 0.7368 - val_loss: 0.8653 - val_acc: 0.7006\n",
            "Epoch 51/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.6930 - acc: 0.7376 - val_loss: 0.8680 - val_acc: 0.7090\n",
            "Epoch 52/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.6847 - acc: 0.7381 - val_loss: 0.8647 - val_acc: 0.6991\n",
            "Epoch 53/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6808 - acc: 0.7435 - val_loss: 0.8496 - val_acc: 0.7066\n",
            "Epoch 54/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6716 - acc: 0.7427 - val_loss: 0.8678 - val_acc: 0.6994\n",
            "Epoch 55/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.6662 - acc: 0.7490 - val_loss: 0.8553 - val_acc: 0.7009\n",
            "Epoch 56/100\n",
            "224/224 [==============================] - 283s 1s/step - loss: 0.6586 - acc: 0.7496 - val_loss: 0.8380 - val_acc: 0.7039\n",
            "Epoch 57/100\n",
            "224/224 [==============================] - 283s 1s/step - loss: 0.6539 - acc: 0.7509 - val_loss: 0.8564 - val_acc: 0.7018\n",
            "Epoch 58/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6576 - acc: 0.7508 - val_loss: 0.8529 - val_acc: 0.7072\n",
            "Epoch 59/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6383 - acc: 0.7571 - val_loss: 0.8484 - val_acc: 0.7127\n",
            "Epoch 60/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.6292 - acc: 0.7600 - val_loss: 0.8534 - val_acc: 0.7081\n",
            "Epoch 61/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.6438 - acc: 0.7561 - val_loss: 0.8454 - val_acc: 0.7063\n",
            "Epoch 62/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.6392 - acc: 0.7585 - val_loss: 0.8728 - val_acc: 0.6943\n",
            "Epoch 63/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6244 - acc: 0.7632 - val_loss: 0.8215 - val_acc: 0.7204\n",
            "Epoch 64/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6263 - acc: 0.7648 - val_loss: 0.8899 - val_acc: 0.7051\n",
            "Epoch 65/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6196 - acc: 0.7670 - val_loss: 0.8310 - val_acc: 0.7048\n",
            "Epoch 66/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6072 - acc: 0.7734 - val_loss: 0.8543 - val_acc: 0.7090\n",
            "Epoch 67/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6139 - acc: 0.7677 - val_loss: 0.8788 - val_acc: 0.6955\n",
            "Epoch 68/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.5923 - acc: 0.7755 - val_loss: 0.8408 - val_acc: 0.7117\n",
            "Epoch 69/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6023 - acc: 0.7716 - val_loss: 0.8529 - val_acc: 0.7012\n",
            "Epoch 70/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.5842 - acc: 0.7804 - val_loss: 0.8348 - val_acc: 0.7054\n",
            "Epoch 71/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.5946 - acc: 0.7756 - val_loss: 0.8629 - val_acc: 0.7042\n",
            "Epoch 72/100\n",
            "224/224 [==============================] - 281s 1s/step - loss: 0.5764 - acc: 0.7806 - val_loss: 0.8474 - val_acc: 0.7084\n",
            "Epoch 73/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.5859 - acc: 0.7784 - val_loss: 0.8499 - val_acc: 0.7057\n",
            "\n",
            "Epoch 00073: ReduceLROnPlateau reducing learning rate to 0.004999999888241291.\n",
            "Epoch 74/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.5619 - acc: 0.7884 - val_loss: 0.8465 - val_acc: 0.7066\n",
            "Epoch 75/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.5654 - acc: 0.7883 - val_loss: 0.8553 - val_acc: 0.7030\n",
            "Epoch 76/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.5579 - acc: 0.7924 - val_loss: 0.8409 - val_acc: 0.7036\n",
            "Epoch 77/100\n",
            "224/224 [==============================] - 284s 1s/step - loss: 0.5482 - acc: 0.7951 - val_loss: 0.8601 - val_acc: 0.7012\n",
            "Epoch 78/100\n",
            "224/224 [==============================] - 284s 1s/step - loss: 0.5559 - acc: 0.7910 - val_loss: 0.8469 - val_acc: 0.7009\n",
            "Epoch 79/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.5520 - acc: 0.7901 - val_loss: 0.8387 - val_acc: 0.7093\n",
            "Epoch 80/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5512 - acc: 0.7923 - val_loss: 0.8400 - val_acc: 0.7075\n",
            "Epoch 81/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5401 - acc: 0.7959 - val_loss: 0.8532 - val_acc: 0.7018\n",
            "Epoch 82/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5450 - acc: 0.7946 - val_loss: 0.8416 - val_acc: 0.7081\n",
            "Epoch 83/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5424 - acc: 0.7945 - val_loss: 0.8654 - val_acc: 0.6994\n",
            "\n",
            "Epoch 00083: ReduceLROnPlateau reducing learning rate to 0.0024999999441206455.\n",
            "Epoch 84/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.5365 - acc: 0.7988 - val_loss: 0.8292 - val_acc: 0.7102\n",
            "Epoch 85/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.5261 - acc: 0.8018 - val_loss: 0.8516 - val_acc: 0.7012\n",
            "Epoch 86/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.5281 - acc: 0.8004 - val_loss: 0.8403 - val_acc: 0.7048\n",
            "Epoch 87/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.5229 - acc: 0.8020 - val_loss: 0.8504 - val_acc: 0.7072\n",
            "Epoch 88/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.5286 - acc: 0.8023 - val_loss: 0.8519 - val_acc: 0.7052\n",
            "Epoch 89/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.5270 - acc: 0.8011 - val_loss: 0.8377 - val_acc: 0.7111\n",
            "Epoch 90/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5194 - acc: 0.8048 - val_loss: 0.8628 - val_acc: 0.7000\n",
            "Epoch 91/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.5277 - acc: 0.7999 - val_loss: 0.8365 - val_acc: 0.7099\n",
            "Epoch 92/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5204 - acc: 0.8038 - val_loss: 0.8545 - val_acc: 0.7090\n",
            "Epoch 93/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.5233 - acc: 0.8031 - val_loss: 0.8359 - val_acc: 0.7060\n",
            "\n",
            "Epoch 00093: ReduceLROnPlateau reducing learning rate to 0.0012499999720603228.\n",
            "Epoch 94/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.5140 - acc: 0.8060 - val_loss: 0.8565 - val_acc: 0.7015\n",
            "Epoch 95/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.5148 - acc: 0.8062 - val_loss: 0.8380 - val_acc: 0.7144\n",
            "Epoch 96/100\n",
            "224/224 [==============================] - 282s 1s/step - loss: 0.5167 - acc: 0.8082 - val_loss: 0.8657 - val_acc: 0.6943\n",
            "Epoch 97/100\n",
            "224/224 [==============================] - 280s 1s/step - loss: 0.5144 - acc: 0.8083 - val_loss: 0.8372 - val_acc: 0.7195\n",
            "Epoch 98/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.5141 - acc: 0.8076 - val_loss: 0.8468 - val_acc: 0.7048\n",
            "Epoch 99/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5120 - acc: 0.8077 - val_loss: 0.8479 - val_acc: 0.7072\n",
            "Epoch 100/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5162 - acc: 0.8069 - val_loss: 0.8522 - val_acc: 0.7075\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JSSv08SHF0bC",
        "colab_type": "code",
        "outputId": "c47570c0-c700-49f4-c441-44814bd78e59",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 71
        }
      },
      "source": [
        "print('\\n# Evaluate on dev data')\n",
        "results_dev = model.evaluate_generator(dev_generator, 3509 // BS)\n",
        "print('dev loss, dev acc:', results_dev)"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "# Evaluate on dev data\n",
            "dev loss, dev acc: [0.8531583790425901, 0.7071759259259259]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ev4sDYDlOsqk",
        "colab_type": "code",
        "outputId": "8ae0fd86-ff1b-41ac-8d3a-903657b6b605",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 71
        }
      },
      "source": [
        "print('\\n# Evaluate on test data')\n",
        "results_test = model.evaluate_generator(test_generator, 3509 // BS)\n",
        "print('test loss, test acc:', results_test)"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "# Evaluate on test data\n",
            "test loss, test acc: [0.7922037023085134, 0.7239583333333334]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "m9f7smhHUQus",
        "colab_type": "code",
        "outputId": "d48da751-2594-4d09-ef1f-96af8528a683",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 591
        }
      },
      "source": [
        "# list all data in history\n",
        "print(history.history.keys())\n",
        "# summarize history for accuracy\n",
        "plt.plot(history.history['acc'])\n",
        "plt.plot(history.history['val_acc'])\n",
        "plt.title('model accuracy')\n",
        "plt.ylabel('accuracy')\n",
        "plt.xlabel('epoch')\n",
        "plt.legend(['train', 'dev'], loc='upper left')\n",
        "plt.show()\n",
        "# summarize history for loss\n",
        "plt.plot(history.history['loss'])\n",
        "plt.plot(history.history['val_loss'])\n",
        "plt.title('model loss')\n",
        "plt.ylabel('loss')\n",
        "plt.xlabel('epoch')\n",
        "plt.legend(['train', 'dev'], loc='upper left')\n",
        "plt.show()"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "dict_keys(['val_loss', 'val_acc', 'loss', 'acc', 'lr'])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F-QKHTmJQhi1",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "epoch_str = '-EPOCHS_' + str(EPOCHS)\n",
        "test_acc = 'test_acc_%.3f' % results_test[1]\n",
        "model.save('/content/drive/My Drive/cs230 project/models/' + 'RESNET50-Class-Weights' + epoch_str + test_acc + '.h5')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4j4nAv4pEN7t",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}